﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    /// <summary>
    /// Interaction logic for Brugere.xaml
    /// </summary>
    public partial class Brugere : UserControl
    {
        #region Fields

        private readonly Controller _controller;
        private IBruger _selectedBruger;

        #endregion

        #region Creation

        public Brugere(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            OpdaterSide();
        }

        #endregion

        #region Event Handlers

        // når der er valgt et nyt item i vores listview
        private void ListViewBrugere_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var bruger = (IBruger)ListViewBrugere.SelectedItem;
            _selectedBruger = bruger;

            BtnSlet.IsEnabled = true;
            BtnRediger.IsEnabled = true;
            BtnRediger.IsDefault = true;
        }

        // der er trykket på knappen i opret formularen
        private void BtnTilføjBruger_OnClick(object sender, RoutedEventArgs e)
        {
            string initialer = TxtBrugerInitialer.Text.ToUpper();
            string navn = TxtBrugerNavn.Text;
            var afdeling = (IAfdeling)ComboBoxBrugerAfdeling.SelectedItem;


            // validerings metoder fra Validator klassen i Utilities projektet
            if (navn.IsValidString() && initialer.IsValidString())
            {
                bool tilføjet = _controller.TilføjBruger(afdeling, initialer, navn);

                if (tilføjet)
                {
                    OpdaterBrugereListView();
                    SkjulGroupBox();
                }
                else
                {
                    MessageBox.Show(
                        "Er du sikker på at der ikke findes en bruger med de samme initialer?",
                        "Fejl", MessageBoxButton.OK, MessageBoxImage.Error
                        );
                }
            }
            else
            {
                MessageBox.Show("Du skal udfylde brugerens initialer og navn.");
            }
        }

        // der er trykket på knappen i rediger formularen
        private void BtnRedigerBruger_OnClick(object sender, RoutedEventArgs e)
        {
            string initialer = TxtBrugerInitialer.Text.ToUpper();
            string navn = TxtBrugerNavn.Text;
            var afdeling = (IAfdeling)ComboBoxBrugerAfdeling.SelectedItem;

            // validerings metoder fra Validator klassen i Utilities projektet
            if (navn.IsValidString() && initialer.IsValidString() && _selectedBruger != null)
            {
                bool redigeret = _controller.RedigerBruger(_selectedBruger, afdeling, initialer, navn);

                if (redigeret)
                {
                    OpdaterBrugereListView();
                    SkjulGroupBox();
                }
                else
                {
                    MessageBox.Show(
                        "Er du sikker på at der ikke findes en bruger med de samme initialer?",
                        "Fejl", MessageBoxButton.OK, MessageBoxImage.Error
                        );
                }
            }
            else
            {
                MessageBox.Show("Du skal udfylde brugerens initialer og navn.");
            }            
        }

        // der er trykket på flytbruger knappen
        private void BtnFlytBrugere_Click(object sender, RoutedEventArgs e)
        {
            bool redigeret = false;

            foreach (var bruger in ListViewBrugere.SelectedItems)
            {
                var tmpBruger = (IBruger)bruger;
                string initialer = tmpBruger.Initialer;
                string navn = tmpBruger.Navn;
                var tmpAfdeling = (IAfdeling) ComboBoxBrugereAfdeling.SelectedItem;

                redigeret = _controller.RedigerBruger(tmpBruger, tmpAfdeling, initialer, navn);
            }
            if (redigeret)
            {
                OpdaterBrugereListView();
                SkjulGroupBox();
            }
        }

        // der er trykket på rediger knappen
        private void BtnRediger_Click(object sender, RoutedEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                VisRedigerBoks();
            }
            else if (ListViewBrugere.SelectedItems.Count > 1)
            {
                VisFlytBrugereBoks();
            }
        }

        // der er trykket på slet knappen
        private void BtnSlet_Click(object sender, RoutedEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                if (MessageBox.Show("Er du sikker på at du vil slette " +
                                    _selectedBruger.Navn + ", " + _selectedBruger.Initialer + "?",
                                    "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                    MessageBoxResult.OK)
                {
                    bool fjernet = _controller.FjernBruger(_selectedBruger);
                    if (fjernet)
                    {
                        OpdaterBrugereListView();
                    }
                    else
                    {
                        MessageBox.Show("Der skete en fejl ved sletning af bruger, muligvis en database fejl.");
                    }
                }
                else
                {
                    SkjulGroupBox();
                }
            }
            else if (ListViewBrugere.SelectedItems.Count > 1)
            {
                bool annulleret = false;
                bool fjernet = false;
                foreach (var bruger in ListViewBrugere.SelectedItems)
                {
                    var tmpBruger = (IBruger)bruger;
                    if (MessageBox.Show("Er du sikker på at du vil slette " +
                                        tmpBruger.Navn + ", " + tmpBruger.Initialer + "?",
                                        "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                        MessageBoxResult.OK)
                    {
                        fjernet = _controller.FjernBruger(tmpBruger);
                    }
                    else
                    {
                        annulleret = true;
                    }
                }
                if (fjernet)
                {
                    OpdaterBrugereListView();
                }
                else if (!annulleret)
                {
                    MessageBox.Show("Der skete en fejl ved sletning af bruger, muligvis en database fejl.");
                }
                SkjulGroupBox();
            }
        }

        // der er trykket på tilføj bruger knappen
        private void BtnOpret_Click(object sender, RoutedEventArgs e)
        {
            VisTilføjBoks();
        }

        // der er dobbeltklikket i ListViewet
        private void ListViewBrugere_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                VisRedigerBoks();
            }
            else if (ListViewBrugere.SelectedItems.Count > 1)
            {
                VisFlytBrugereBoks();
            }
        }

        // der er trykket på annullere knappen
        private void BtnAnnullere_Click(object sender, RoutedEventArgs e)
        {
            SkjulGroupBox();
        }

        // context menu, rediger knap
        private void MenuItemRediger_OnClick(object sender, RoutedEventArgs e)
        {
            BtnRediger_Click(null, new RoutedEventArgs());
        }

        // context menu, slet knap
        private void MenuItemSlet_OnClick(object sender, RoutedEventArgs e)
        {
            BtnSlet_Click(null, new RoutedEventArgs());
        }

        #endregion

        #region Tilstandsstyring

        // tilsatndsstyring til at opdatere siden
        public void OpdaterSide()
        {
            OpdaterBrugereListView();
            SkjulGroupBox();

            // hent alle afdelinger, og tilføj dem til combo box
            ComboBoxBrugerAfdeling.ItemsSource = _controller.HentAlleAfdelinger();
            ComboBoxBrugereAfdeling.ItemsSource = _controller.HentAlleAfdelinger();           
        }

        // metode til at opdatere indholdet i listviewet
        private void OpdaterBrugereListView()
        {
            ListViewBrugere.ItemsSource = _controller.HentAlleBrugere();
        }

        // tilstandsstyring til at vise boksen med redigering af bruger
        private void VisRedigerBoks()
        {
            DisableListView();
            GroupBoxBrugere.Visibility = Visibility.Visible;
            GroupBoxBrugere.Header = "Rediger bruger";

            TxtBrugerNavn.Text = _selectedBruger.Navn;
            TxtBrugerInitialer.Text = _selectedBruger.Initialer;

            // den valgte brugers afdeling
            var userAfdeling = _controller.HentBrugersAfdeling(_selectedBruger);

            // kør igennem all afdelinger, og tjek om den valgte brugers afdeling findes i listen
            foreach (var item in ComboBoxBrugerAfdeling.Items)
            {
                var tmp = (IAfdeling) item;
                
                if (tmp == userAfdeling)
                {
                    ComboBoxBrugerAfdeling.SelectedItem = item;
                }
            }


            BtnAnnullere.IsCancel = true;
            BtnRedigerBruger.IsDefault = true;
            BtnTilføjBruger.IsDefault = false;

            BtnAnnullere.Visibility = Visibility.Visible;
            BtnRedigerBruger.Visibility = Visibility.Visible;
            BtnTilføjBruger.Visibility = Visibility.Collapsed;

            FocusBrugerTextBox();
        }

        // tilstandsstyring til at vise boksen med flytning af flere brugere på en gang
        private void VisFlytBrugereBoks()
        {
            DisableListView();
            GroupBoxFlytBrugere.Visibility = Visibility.Visible;
            GroupBoxFlytBrugere.Header = "Flyt brugere til anden afdeling";

            BtnAnnullere2.IsCancel = true;
            BtnRediger.IsDefault = false;
            BtnFlytBrugere.IsDefault = true;

            BtnAnnullere2.Visibility = Visibility.Visible;
            BtnFlytBrugere.Visibility = Visibility.Visible;

            FocusComboBox();
        }

        // tilstandsstyring til at vise boksen med tilføjelse af ny bruger
        private void VisTilføjBoks()
        {
            DisableListView();
            GroupBoxBrugere.Visibility = Visibility.Visible;
            GroupBoxBrugere.Header = "Tilføj ny bruger";

            BtnAnnullere.IsCancel = true;
            BtnRedigerBruger.IsDefault = false;
            BtnTilføjBruger.IsDefault = true;
            
            BtnAnnullere.Visibility = Visibility.Visible;
            BtnRedigerBruger.Visibility = Visibility.Collapsed;
            BtnTilføjBruger.Visibility = Visibility.Visible;

            TxtBrugerInitialer.Text = "";
            TxtBrugerNavn.Text = "";

            FocusBrugerTextBox();
        }

        // sæt fokus på txt box til afdelingens navn, og vælg alt tekst (hvis der er noget)
        public void FocusBrugerTextBox()
        {
            // sæt focus på tekstbox, skal køre en Dispatcher tråd
            Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(() => ComboBoxBrugerAfdeling.Focus()));
        }

        // sæt fokus på combobox til afdelingens navn, og vælg alt tekst (hvis der er noget)
        public void FocusComboBox()
        {
            Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(() => ComboBoxBrugereAfdeling.Focus()));
        }

        // tilstandstyring til at skjule groupboxene med
        private void SkjulGroupBox()
        {
            GroupBoxBrugere.Visibility = Visibility.Collapsed;
            GroupBoxFlytBrugere.Visibility = Visibility.Collapsed;
            ListViewBrugere.IsEnabled = true;
            ListViewBrugere.SelectedItem = null;
            BtnOpret.IsEnabled = true;
            BtnSlet.IsEnabled = false;
            BtnRediger.IsEnabled = false;
        }

        // tilstandsstyring til at disable listviewet mens man redigere i groupboxen
        private void DisableListView()
        {
            ListViewBrugere.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnOpret.IsEnabled = false;
            BtnSlet.IsEnabled = false;
        }

        #endregion
    }
}
